package com.vvv.designpattern.behavioralpattern;

/**
 * @author vvv
 * @date 2023-11-13 13 12
 * discription
 * 策略模式：策略模式是一种行为型模式，它将对象和行为分开，
 * 将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化，行为之间可以相互替换。
 * 每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化
 */
public class Strategy01 {
    public static void main(String[] args) {
        /**
         * 线程池的拒绝策略用的就是策略模式，具体看threadpool包下面的代码
         * 下面的以对商品打折的例子
         */
        DiscountStrategy noDiscount = new NoDiscount();


        Context context1 = new Context(noDiscount);
        System.out.println(context1.getPrice(100, 2));

        DiscountStrategy tenDiscount = new TenDiscount();
        Context context2 = new Context(tenDiscount);
        System.out.println(context2.getPrice(100, 2));
    }
}

/**
 * 策略的抽象方法
 */
interface DiscountStrategy {
    // 一个计算价格的抽象方法
    //price商品的价格 n商品的个数
    double calcPrice(double price, int n);
}

/**
 * 具体的策略
 */
class NoDiscount implements DiscountStrategy {
    @Override
    public double calcPrice(double price, int n) {
        return price * n;
    }
}

/**
 * 具体的策略
 */
class TenDiscount implements DiscountStrategy {

    @Override
    public double calcPrice(double price, int n) {
        return price * n * 0.9;
    }
}

/**
 * 上下文类，起承上启下封装作用。
 */
class Context {
    private DiscountStrategy discountStrategy;

    public Context(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double getPrice(double goodsPrice, int n) {
        return discountStrategy.calcPrice(goodsPrice, n);
    }
}

